﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ApplicationGenerator.BusinessModule.Interfaces
{
    /// <summary>
    /// Interfejs dla modelu
    /// </summary>
    public interface IModel
    {
        /// <summary>
        /// Instancja modelu
        /// </summary>
        object ModelInstance { get; }

        /// <summary>
        /// Meta model powiązany z modelem
        /// </summary>
        IMetaModel MetaModel { get; }

        /// <summary>
        /// Ustawia właściwość modelu
        /// </summary>
        /// <param name="propertyName">Nazwa właściwości do ustawienia</param>
        /// <param name="propertyValue">Wartość, która ma zostać nadana danej właściwości</param>
        void SetProperty(string propertyName, object propertyValue);

        /// <summary>
        /// Pobiera wartość danej właściwości
        /// </summary>
        /// <param name="propertyName">Nazwa właściwości do pobrania</param>
        /// <returns>Wartość danej właściwości</returns>
        object GetProperty(string propertyName);

        /// <summary>
        /// Ustawia wartość słownikową w modelu
        /// </summary>
        /// <param name="dictionaryName">Nazwa właściwości słownikowej</param>
        /// <param name="dictionaryValue">Wartość słownikowa</param>
        void SetDictionaryValue(string dictionaryName, string dictionaryValue);

        /// <summary>
        /// Pobiera wartość słownikową
        /// </summary>
        /// <param name="dictionaryName">Nazwa właściwości słownikowej</param>
        /// <returns>Wartość słownikowa</returns>
        string GetDictionaryValue(string dictionaryName);

        /// <summary>
        /// Ustawia relację w danym modelu
        /// </summary>
        /// <param name="relationName">Nazwa właściwości z obiektem relacji</param>
        /// <param name="relation">Obiekt modelu relacji</param>
        void SetRelation(string relationName, IModel relation);

        /// <summary>
        /// Pobiera obiekt relacyjny modelu
        /// </summary>
        /// <param name="relationName">Nazwa właściwości z obiektem relacji</param>
        /// <returns>Obiekt relacji</returns>
        IModel GetRelation(string relationName);

        /// <summary>
        /// Dodaje obiekt modelu do listy modeli
        /// </summary>
        /// <param name="listName">Nazwa właściwości z listą modeli</param>
        /// <param name="listElement">Obiekt modelu</param>
        void AddToList(string listName, IModel listElement);

        /// <summary>
        /// Dodaje listę obiektów modeli do listy modeli
        /// </summary>
        /// <param name="listName">Nazwa właściwości z listą modeli</param>
        /// <param name="listOfElements">Lista obiektów modeli</param>
        void AddToList(string listName, IList<IModel> listOfElements);

        /// <summary>
        /// Usuwa obiekt modelu z listy modeli
        /// </summary>
        /// <param name="listName">Nazwa właściwości z listą modeli</param>
        /// <param name="listElement">Obiekt modelu</param>
        void RemoveFromList(string listName, IModel listElement);

        /// <summary>
        /// Pobiera obiekt modelu z listy modeli
        /// </summary>
        /// <param name="listName">Nazwa właściwości z listą modeli</param>
        /// <param name="elementIndex">Indeks modelu do pobrania</param>
        /// <returns>Obiekt modelu</returns>
        IModel GetListElement(string listName, int elementIndex);

        /// <summary>
        /// Pobiera liczbę modeli z listy
        /// </summary>
        /// <param name="listName">Nazwa właściwości z listą modeli</param>
        /// <returns></returns>
        int GetListCount(string listName);

        /// <summary>
        /// Pobiera listę modeli
        /// </summary>
        /// <param name="listName">Nazwa właściwości z listą modeli</param>
        /// <returns>Lista modeli</returns>
        IList<IModel> GetList(string listName);

        /// <summary>
        /// Odświeża właściwości modelu
        /// </summary>
        void Refresh();

        /// <summary>
        /// Usuwa instancję modelu
        /// </summary>
        void Delete();

        /// <summary>
        /// Zapisuje model
        /// </summary>
        void Save();
    }
}
